package cz.pecinovsky.english.pojj.adv_demo.cesta_školou.hra;

import static cz.pecinovsky.english.pojj.adv_demo.cesta_školou.hra.SS_CestaSkolou.*;



/*******************************************************************************
 * Instance tridy {@code PrikazVezmi} predstavuje prikaz
 * k odebrani predmetu z aktualni mistnosti a jeho umisteni do batohu.
 * Aby byl prikaz proveden, musi byt zadan nazev predmetu,
 * ktery se v aktualni mistnosti vyskytuje, predmet musi byt
 * zvednutelny a v batohu musi byt jeste volne misto.
 *
 * @author    Rudolf PECINOVSKY
 * @version   5.0
 */
public class PrikazVezmi implements Prikaz
{
//== KONSTANTNI ATRIBUTY TRIDY =================================================
//== PROMENNE ATRIBUTY TRIDY ===================================================
//== KONSTANTNI ATRIBUTY INSTANCI ==============================================

    private final HerniPlan plan;



//== PROMENNE ATRIBUTY INSTANCI ================================================
//== NESOUKROME METODY TRIDY ===================================================

//##############################################################################
//== KONSTRUKTORY A TOVARNI METODY =============================================

    /***************************************************************************
     * Vytvori prikaz <b>vezmi</b>.
     */
    PrikazVezmi(HerniPlan plan) {
        this.plan = plan;
    }


//== ABSTRAKTNI METODY =========================================================
//== NESOUKROME METODY INSTANCI ================================================

    /***************************************************************************
     *  Metoda vrací název příkazu (slovo které používá hráč pro jeho vyvolání)
     *
     *  @ return nazev prikazu
     */
    @Override
    public String getNazev() {
        return pZVEDNI;
    }


    /***************************************************************************
     * Vezme z místnosti předmět zadaného názvu a umístí je do batohu;
     * nejprve však zkontroluje, zda byl vůbec zadán název předmětu,
     * který se má zvednout, zda je tento předmět zvednutelný a zda se další
     * předmět ještě vejde do batohu.
     *
     * @param  parametry Nazev zvedaneho predmetu
     * @return Text zpravy vypsane po porovedeni prikazu
     */
    @Override
    public String proved( String... parametry )
    {
        if (parametry.length == 0) {
            return zPŘEDMĚT_NEZADAN;                             //==========>
        }
        String   nazev   = parametry[0];
        HraCestaSkolou hra     = plan.getHra();
        Mistnost       am      = hra.getActualPlace();
        Objekt         predmet = am.zvedni( nazev );
        if (predmet == null ) {
            return zNENÍ_PŘEDMĚT + nazev;                        //==========>
        }
        if (predmet == Objekt.TÍHA) {
            return zTEŽKÝ_PŘEDMĚT + nazev;                       //==========>
        }
        Batoh batoh = hra.getBag();
        if (! batoh.přidej(predmet)) {
            am.polož( predmet );
            return zPLNÝ_BATOH + nazev;                          //==========>
        }
        return zZVEDNUTÍ + predmet.getName();                   //==========>
    }


//== SOUKROME A POMOCNE METODY TRIDY ===========================================
//== SOUKROME A POMOCNE METODY INSTANCI ========================================
//== VNORENE A VNITRNI TRIDY ===================================================
//== TESTY A METODA MAIN =======================================================
}
